iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
Mobile Development

30天,從0開始用Kotlin寫APP系列 第 27

Day 27 | DataBinding Library 強化資料與元件的連結

  • 分享至 

  • xImage
  •  

DataBinding

在之前我們有介紹過 View 要取得資料會透過 LiveData , 觀察資料是否變動以及 View 是否要更改,那其實還有另外一個方法也可以達到更新 View 的效果,那就是 DataBinding

DataBinding 的功能就是在做 ViewModel 與 View 之間的資料綁定,那這和 LiveData 之間有什麼不同呢?

其實最大的差異就在 LiveData 是會在 Activity 或是 Fragment函式 的型態去做綁定,當 View 收到資料更新的 event 後,會在函式中進行重畫 Layout 、決定元件是否要顯示或是再去 Call 其他函式...等等行為

DataBinding 則是直接與 Layout 上的元件 做綁定,舉例來說,假設將 Layout 上的 TextViewUser 資料 做綁定,那麼當 ViewModel 收到 User 資料改變時,可以不用透過 ActivityFragment ,而是直接讓 TextView 元件顯示的內容做出改變 ,達到 Layout 更新的效果

而也因為 DataBinding 有這樣的能力,也帶來另外的價值就是不再需要寫 findViewById()

findViewById() 的消失演化史

findViewById()

過去在寫 Java 的時候若要使用 Layout 上的元件,一定要先幫元件設定一個 id ,接著再用 findViewById() 的方式去取得元件,接著才有操作的能力,因此常常會看到在 onCreate() 的時候寫了一堆取得元件和初始化元件 Code

Butter Knife

那想當然爾,就會有人希望可以減少這些用途不大卻很煩瑣的程式碼,因此就會導入 Butter Knife 這個框架去輔助取得元件的過程

kotlinx.android.synthetic

然而從 Java 換到 Kotlin 時發現 findViewById()Butter Knife 都不再需要了,因為 Kotlin 本身就有支援 View Binding 的 Extension - kotlinx.android.synthetic,然而這個 Extension 並沒有真正取得 Google 官方的支持,而是在 Google 推出 Jetpack 的時候推荐了 Data Binding Library

Data Binding Library

儘管 Data Binding Library 原先的用意不是在消滅 findViewById() ,而是做和 Layout 元件的綁定,但這樣的設計方法也順勢解決這個問題,因此只要 Layout 中的元件有加上 id ,那就能透過 binding 找到

DataBinding vs. kotlinx.android.synthetic vs. Butter Knife

那在上一個段落有提到 DataBindingkotlinx.android.synthetic 以及 Butter Knife 都可以解決 findViewById() ,那在實作上選哪個會比較好呢?

這個問題已經由 Andorid Developer AdvocateButter Knife 中的 Readme 給出答案,簡單統整下來我給出以下結論

kotlinx.android.synthetic 並沒有得到官方的 "推荐",但是並不代表他是不好的,因此如果目前已經有在使用,而且並沒有其他需求的話,可以繼續使用他

而 Butter Knife 的時代已經被終結了,如果你打開 Butter Knife 的 Github ,就能在第1行看到 "This tool is now deprecated. Please switch to view binding"

因此可以在 DataBinding 和 kotlinx.android.synthetic 擇一,但如果有資料綁定 Layout 元件的需求就大膽的使用 DataBinding 吧!


未完待續...

Reference


上一篇
Day 26 | Firebase Auth 管理登入
下一篇
Day 28 | RxJava & RxKotlin
系列文
30天,從0開始用Kotlin寫APP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言